الدليل الشامل في استخدام استعلامات WP_Query في ووردبريس
تُعد فئة WP_Query واحدة من أقوى الأدوات وأكثرها مرونة في نظام إدارة المحتوى ووردبريس، حيث تسمح بإنشاء استعلامات مخصصة لاستخراج المحتوى من قاعدة البيانات بناءً على معايير دقيقة. من خلال WP_Query يمكن للمطورين التحكم الكامل في عرض التدوينات، الصفحات، الأنواع المخصصة من المحتوى، والحقول الوصفية المرتبطة بها، مع إمكانية تصفية النتائج وترتيبها وفقًا لاحتياجات متقدمة. يعد إتقان استخدام WP_Query خطوة أساسية لكل مطور يرغب في بناء مواقع ديناميكية متقدمة قائمة على ووردبريس.
في هذا الدليل الموسّع، سيتم تناول جميع جوانب WP_Query بشكل منهجي وعميق، ابتداءً من الأساسيات وحتى الاستعلامات المعقدة والمتقدمة، مع تغطية الهيكل، المعلمات، الاستخدامات المختلفة، الأداء، الأخطاء الشائعة، والتقنيات المرتبطة.
أولًا: ما هي WP_Query؟
WP_Query هي فئة (Class) موجودة ضمن نواة ووردبريس، وهي مسؤولة عن تنفيذ استعلامات SQL بطريقة آمنة ومدارة من خلال نظام ووردبريس. بعبارة أخرى، تُستخدم WP_Query لطلب التدوينات (أو الأنواع الأخرى من المنشورات) من قاعدة البيانات بناءً على معايير معينة يحددها المطور.
php$query = new WP_Query( array(
'post_type' => 'post',
'posts_per_page' => 10,
) );
الكود أعلاه يسترجع آخر 10 تدوينات من نوع post.
ثانيًا: البنية الأساسية لـ WP_Query
عند إنشاء كائن جديد من WP_Query، يُمرر مصفوفة من المعلمات (arguments) تُحدد خصائص الاستعلام. المعلمات تدعم مجموعة كبيرة من الخيارات التي تتحكم في نوع المحتوى، العدد، الترتيب، الفئات، التصنيفات، الحقول الوصفية، التاريخ، والمزيد.
البنية العامة:
php$query = new WP_Query( array(
// معلمات الاستعلام
) );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
// عرض المحتوى
}
wp_reset_postdata();
}
ثالثًا: المعلمات الأساسية للاستعلام
| المعلمة | الوصف |
|---|---|
'post_type' |
لتحديد نوع المنشور مثل post, page, أو نوع مخصص |
'posts_per_page' |
لتحديد عدد النتائج المسترجعة |
'orderby' |
لترتيب النتائج بناءً على قيمة معينة مثل date, title, meta_value |
'order' |
تحديد الترتيب تصاعدي (ASC) أو تنازلي (DESC) |
'category_name' |
لاستعلام التدوينات حسب اسم الفئة |
'tag' |
لاستعلام التدوينات حسب الوسوم |
'paged' |
لتفعيل الترقيم (pagination) |
رابعًا: استعلامات الأنواع المخصصة (Custom Post Types)
عند العمل مع أنواع منشورات مخصصة، مثل “مشاريع”، يمكن استخدام post_type لعرض هذه الأنواع بسهولة:
php$query = new WP_Query( array(
'post_type' => 'project',
'posts_per_page' => -1,
) );
خامسًا: استعلام التصنيفات (Taxonomy Queries)
يمكن استهداف تصنيفات مخصصة باستخدام tax_query:
php$query = new WP_Query( array(
'post_type' => 'product',
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'electronics',
),
),
) );
يدعم tax_query عمليات أكثر تعقيدًا من خلال الجمع المنطقي بين الشروط باستخدام relation (مثل AND, OR).
سادسًا: استعلامات الحقول الوصفية (Meta Queries)
للاستعلام بناءً على الحقول الوصفية، تُستخدم meta_query:
php$query = new WP_Query( array(
'post_type' => 'event',
'meta_query' => array(
array(
'key' => 'event_date',
'value' => '2025-01-01',
'compare' => '>=',
'type' => 'DATE',
),
),
) );
تُستخدم meta_query بكثرة عندما يحتوي المحتوى على بيانات إضافية محفوظة كـ Metadata.
سابعًا: استعلامات التاريخ والوقت
php$query = new WP_Query( array(
'date_query' => array(
array(
'after' => 'January 1st, 2024',
),
),
) );
تُستخدم date_query لفلترة التدوينات بناءً على تاريخ النشر، ويمكن دمجها مع معلمات أخرى.
ثامنًا: الجمع بين شروط متعددة
يمكن الجمع بين meta_query و tax_query و date_query ضمن استعلام واحد لإنشاء استعلامات مركبة ومعقدة.
php$query = new WP_Query( array(
'post_type' => 'course',
'meta_query' => array(
array(
'key' => 'duration',
'value' => 10,
'compare' => '>=',
'type' => 'NUMERIC',
),
),
'tax_query' => array(
array(
'taxonomy' => 'level',
'field' => 'slug',
'terms' => 'beginner',
),
),
) );
تاسعًا: استعلامات متقدمة باستخدام المعاملات المنطقية
php'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'price',
'value' => 100,
'compare' => '>=',
'type' => 'NUMERIC',
),
array(
'key' => 'availability',
'value' => 'in_stock',
'compare' => '=',
),
),
المرونة الكبيرة التي توفرها relation تجعل من الممكن إنشاء شروط منطقية شديدة التعقيد لتصفية المحتوى بدقة عالية.
عاشرًا: الأداء وتحسين الاستعلامات
عند التعامل مع مواقع تحتوي على كميات ضخمة من البيانات، يجب الانتباه إلى أداء الاستعلامات. بعض النصائح تشمل:
-
تجنب استخدام
posts_per_page => -1بشكل مفرط. -
تأكد من وجود فهارس (Indexes) على الحقول الوصفية المستخدمة بكثرة.
-
استخدام
fields => 'ids'عند الحاجة فقط إلى المعرفات لتقليل الحمل.
الحادي عشر: تقنيات مفيدة وملاحظات متقدمة
استخدام get_posts كبديل خفيف
get_posts() هي دالة مغلفة تستخدم WP_Query ولكن تُرجع نتائج أقل تعقيدًا، مما يجعلها أسرع للأغراض البسيطة.
php$posts = get_posts( array(
'numberposts' => 5,
'post_type' => 'post',
) );
استخدام pre_get_posts لتعديل الاستعلام الرئيسي
phpfunction modify_main_query( $query ) {
if ( is_home() && $query->is_main_query() ) {
$query->set( 'posts_per_page', 5 );
}
}
add_action( 'pre_get_posts', 'modify_main_query' );
تُستخدم هذه الطريقة لتخصيص استعلامات ووردبريس الافتراضية دون الحاجة لإنشاء استعلام جديد.
التعامل مع الاستعلامات الفارغة
في حال عدم وجود نتائج، يجب دائمًا استخدام شرط have_posts() لتجنب الأخطاء.
جدول ملخص للمعلمات الأكثر استخدامًا في WP_Query
| المعلمة | النوع | الوصف |
|---|---|---|
post_type |
سلسلة | نوع المحتوى (post, page, custom) |
posts_per_page |
عدد | عدد النتائج |
orderby |
سلسلة | ترتيب النتائج (date, title, meta_value, إلخ) |
order |
سلسلة | تصاعدي ASC أو تنازلي DESC |
meta_query |
مصفوفة | استعلام حسب الحقول الوصفية |
tax_query |
مصفوفة | استعلام حسب التصنيفات |
paged |
عدد | لتفعيل الترقيم |
date_query |
مصفوفة | استعلام حسب التاريخ والوقت |
author |
عدد أو مصفوفة | لاستعلام التدوينات حسب الكاتب |
s |
سلسلة | البحث النصي داخل المحتوى |
المصادر والمراجع
تم تصميم هذا الدليل ليكون مرجعًا تقنيًا شاملًا حول استخدام WP_Query في ووردبريس، وقد رُكز فيه على تغطية الجوانب العملية والبرمجية كافة بطريقة احترافية قابلة للتنفيذ مباشرة داخل مشاريع المطورين.

